
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author yuri
 */
public class Arvore {

    /**
     * DefaultMutableTreeNode e um nodo que possui pai e varios filhos, caso nao
     * possua um pai, entao o nodo e o elemento raiz.
     */
    private DefaultMutableTreeNode rootNode;
    /**
     * Creio que a classe DefaultTreeModel funciona da mesma forma que o DefaultTableModel
     * onde para adicionar uma nova linha numa tabela e preciso mexer no modelo dela.
     */
    private DefaultTreeModel treeModel;

    /**
     * Para inicializar a classe e preciso informar qual e o elemento raiz.
     * @param Qualquer classe na qual sera efetuada a busca.
     */
    public Arvore(Object object) {
        /**
         * gera o elemento raiz da arvore.
         */
        rootNode = new DefaultMutableTreeNode(object);
        /**
         * passa o elemento raiz para o modelo que sera trabalhado.
         */
        treeModel = new DefaultTreeModel(rootNode);
    }

    /**
     * Metodo que remove todos os elementos da arvore, menos o raiz.
     */
    public void limparArvore() {
        rootNode.removeAllChildren();
        /**
         * recarega o modelo.
         */
        treeModel.reload();
    }

    /**
     * Remove um determinado nodo da arvore.
     * @param nodo que sera removido.
     */
    public void removerNodo(DefaultMutableTreeNode nodo) {
        /**
         * recupera o nodo pai do elemento a ser removido.
         */
        MutableTreeNode pai = (MutableTreeNode) nodo.getParent();
        if (pai != null) {
            /**
             * se o elemento possuir um pai, remove o elemento do modelo.
             */
            treeModel.removeNodeFromParent(nodo);
        }
    }

    /**
     * Adiciona um novo nodo na arvore.
     * @param nodo pai.
     * @param objeto a ser inserido em um novo nodo.
     * @return nodo com o objeto inserido.
     */
    public DefaultMutableTreeNode adicionarNodo(DefaultMutableTreeNode pai, Object object) {
        /**
         * instancia um novo nodo e insere o objeto nele.
         */
        DefaultMutableTreeNode nodo = new DefaultMutableTreeNode(object);
        if (pai == null) {
            /**
             * caso o pai seja nulo entem o nodo pai e considerado o raiz.
             * Sempre deve existir um nodo pai.
             */
            pai = rootNode;
        }
        /**
         * insere no nodo no modelo.
         */
        treeModel.insertNodeInto(nodo, pai, pai.getChildCount());
        /**
         * retorna o nodo com o objeto inserido.
         */
        return nodo;
    }

    /* gets */

    /**
     * @return the rootNode
     */
    public DefaultMutableTreeNode getRootNode() {
        return rootNode;
    }

    /**
     * @return the treeModel
     */
    public DefaultTreeModel getTreeModel() {
        return treeModel;
    }
}
